
MongoDB的基本使用
MongoDB特点：

使用BSON存储数据
支持相对丰富的查询操作（相对其他nosql数据库）
支持索引
副本集（支持多个实例/多个服务器运行同个数据库）
分片（数据库水平扩展）
无模式（同个数据文档中的数据可以不一样）
部署简单方便（默认无密码，也带来安全问题）

服务的启动：

mongod

(此前需要安装了mongo数据库，并创建过mongodb的目录：$ mkdir -p /data/db）
启动mongodb后，可以使用mongo命令行来操作数据库，或使用Robomongo这样的GUI客户端。
Mongo命令行工具操作MongoDB：
使用一个数据库：（mongodb不需要预先创建数据库，当给一个数据库写入内容时会自动创建）

$ use mytest

插入数据：（给mytest数据库下的users集合插入一条文档）

$ db.users.insert({"username": "nuanfeng"})

然后可以查看数据库和集合：

$ show dbs
$ show collections

查看users集合中的所有文档：

$ db.users.find()

再添加一条数据：（mongodb是无模式的，所以可以添加不同格式的数据）

$ db.users.insert({"username": "Zoe", "group": "reporter"})

再用db.users.find()查看，如下：

查看数据的数量：

$ db.users.find().count()

根据id查询数据：

$ db.users.find({"_id": ObjectId("584bc73ea635e489676cf5db")})

更新数据： (匹配到的第一条）

$ db.users.update({"username": "Zoe"}, {$set: {"group": "writer"}})

更新数据： (匹配到的所有）

$ db.users.update({"username": "Zoe"}, {$set: {"group": "writer"}}, {multi: true})

用save()也可以修改数据：（必须根据‘_id’，会直接替换掉原来的数据)

db.users.save({"_id": ObjectId("584bc73ea635e489676cf5db"), "group": "reporter"})

删除满足条件的所有：

$ db.users.remove({"group": "reporter"});

删除满足条件的第一条：

$ db.users.remove({"group": "reporter"}, true);

删除集合中的所有文档：

$ db.users.remove({})

删除整个集合（所有文档和索引）

$ db.users.drop()

&nbsp;
使用Mongoose模块操作MongoDB
模块介绍
Mongoose是将nodejs的对象和MongoDB中的文档对应的一个模块。
Mongoose既支持强模式，也支持无模式。
安装mongoose：

$ npm install mongoose

先看一下最终的目录结构：
配置与链接
链接的格式：（也可以省略用户名、密码、端口号）

var uri = 'mongodb://username:password@hostname:port/databasename'
mongoose.connect(uri);

Model与Schema
Model使nodejs对象和MongoDB中的文档相对应，Schema实现了Model的数据类型和结构的定义，从而在无模式的MongoDB中实现了模式化的存储。
model.js

/** 配置并链接MongoDB **/
var mongoose = require('mongoose');
var uri = 'mongodb://localhost/mongoose-base';

mongoose.connect(uri);

/** 创建Schema、创建Model **/
var BookSchema = new mongoose.Schema({
    name: String,
    author: String,
    publishTime: Date
});

mongoose.model('Book', BookSchema);

创建文档
insert.js

var mongoose = require('mongoose');
require('./model.js');

/** 获取Model，创建Book的实例 Entity **/
var Book = mongoose.model('Book');

var book = new Book({
  name: 'MEAN Web Develop',
  author: 'Green',
  publishTime: new Date()
});

book.author = 'Jim';    // 参数可以重新指定

/** 插入数据 **/
book.save(function(err) {    // 执行保存，并查看返回情况
    console.log('save status:', err ? 'failed' : 'success');
})

简单查询
find.js

var mongoose = require('mongoose');
require('./model.js');

var Book = mongoose.model('Book');

/** 查询所有数据 **/
Book.find({}, function(err, docs) {
  if (err) {
    console.log('err:', err);
    return;
  }
  console.log(docs)
})

findOne.js

var mongoose = require('mongoose');
require('./model.js');

var Book = mongoose.model('Book');

/** 查询一条数据，并修改 **/
Book.findOne({author: 'Jim'}, function(err, doc) {
  if (err) {
    console.log('err:', err);
    return;
  }
  doc.author = 'James';
  doc.save();
  console.log('findOne result:', doc)
})

删除文档
remove.js

var mongoose = require('mongoose');
require('./model.js');

var Book = mongoose.model('Book');

Book.findOne({ author: 'Jim' }, function(err, doc) {
  if (err) {
    console.log('findOne err:', err);
    return;
  }

  if (doc) {
    doc.remove();
  }
})

条件语句

var mongoose = require('mongoose');
require('./model.js');

var Book = mongoose.model('Book');

var cond = {
    $or: [
        {author: 'Jim'},
        {author: 'James'}
    ]
};
Book.find(cond, function(err, docs){
    if(err) {
        console.log('find by cond err:', err);
    }
    console.log('cond:', cond, 'result:', docs);
})

&nbsp;
在Express项目中使用Mongoose
快速生成express应用
这里我们用express-generator来快速生成express应用（先安装好node、npm、express-generator、mongodb）

$ express mongooseExpress

先看下最终的项目结构图：

配置数据库并连接
新建config文件夹，用来放置数据库配置信息
config/config.js

module.exports = {
    mongodb: 'mongodb://localhost:27017/mongoose-test'
}

config/mongoose.js

var mongoose = require('mongoose');
var config = require('./config.js');

module.exports = function() {
    var db = mongoose.connect(config.mongodb);

    require('../models/user.server.model.js');
    return db;
}

全局引入mongoose
在app.js的路由模块前引用刚才创建的mongoose配置信息(8,9两行）

 1 var express = require('express');
 2 var path = require('path');
 3 var favicon = require('serve-favicon');
 4 var logger = require('morgan');
 5 var cookieParser = require('cookie-parser');
 6 var bodyParser = require('body-parser');
 7 
 8 var mongoose = require('./config/mongoose.js');
 9 var db = mongoose();
10 
11 var index = require('./routes/index');
12 var users = require('./routes/users');&nbsp;

创建Schema和Model
新建models文件夹
/models/user.server.model.js

var mongoose = require('mongoose');

var UserSchema = new mongoose.Schema({
    uid: Number,
    username: String,
    createTime: Date,
    lastLogin: Date
});

mongoose.model('User', UserSchema);

编写数据库处理逻辑代码
我们直接在users路由模块中加入数据库存取操作的代码
/routes/users.js

 1 var express = require('express');
 2 var router = express.Router();
 3 
 4 var mongoose = require('mongoose');
 5 var User = mongoose.model('User');
 6 
 7 /* GET users listing. */
 8 router.get('/', function(req, res, next) {
 9   res.send('respond with a resource');
10 });
11 
12 router.get('/test', function(req, res, next) {
13     var user = new User({
14         uid: 1,
15         username: 'nuanfeng'
16     })
17 
18     user.save(function(err){
19         if(err) {
20             res.end('Error');
21             return next();
22         }
23 
24         User.find({}, function(err, docs) {
25             if(err) {
26                 res.end('Error');
27                 return next();
28             }
29 
30             res.json(docs);
31         })
32     })
33 })
34 
35 module.exports = router;

运行node查看效果

$ node bin/www

然后在浏览器中访问：http://localhost:3000/users/test，就能往数据库中存入一条记录，并在当前页面返回它的json数据
